#define _GNU_SOURCE
#include "pthread.h"
#include "unistd.h"
#include "stdio.h"
#include "mqueue.h"

mqd_t mq;

void *thread1(void *arg)
{
    printf("子线程tid1启动，pid: %d，准备发送消息\n", getpid());
    // 发送消息
    mq_send(mq, "hello world", 11, 1);
    printf("发送消息成功\n");
    return NULL;
}
void *thread2(void *arg)
{
    sleep(1);
    printf("子线程tid2启动，pid: %d，准备接受消息\n", getpid());
    // 接收消息
    char buf[100];
    ssize_t len = mq_receive(mq, buf, 100, NULL);
    if (len == -1)
    {
        printf("接收消息失败\n");
        return NULL;
    }
    printf("接收消息成功，接收到的消息是：%.*s\n", (int)len, buf);
    return NULL;
}

int main(int argc, char const *argv[])
{
    printf("main线程启动，pid: %d\n", getpid());
    // 创建队列
    struct mq_attr attr;
    attr.mq_maxmsg = 10;
    attr.mq_msgsize = 100;
    mq = mq_open("/mq1", O_CREAT | O_RDWR, 0644, &attr);
    pthread_t tid1, tid2;
    pthread_create(&tid1, NULL, thread1, NULL);
    pthread_create(&tid2, NULL, thread2, NULL);
    pthread_join(tid1, NULL);
    pthread_join(tid2, NULL);
    printf("main线程结束，pid: %d\n", getpid());
    // 关闭并删除队列
    mq_close(mq);
    mq_unlink("/mq1");
    return 0;
}
